import 'dart:math'; // 导入 dart:math 库

void main() {
  print('--- Dart Math 库示例开始 ---');

  // --- 三角函数 ---
  print('\n--- 三角函数 ---');
  // 注意：Dart 的三角函数使用弧度 (radians)，而不是角度 (degrees)！

  // 余弦 (Cosine)
  // cos(pi) 应该等于 -1.0
  double cosOfPi = cos(pi);
  print('cos(pi) = $cosOfPi');
  assert(cosOfPi == -1.0);

  // 正弦 (Sine)
  var degrees = 30;
  // 将角度转换为弧度：弧度 = 角度 * (pi / 180)
  var radians = degrees * (pi / 180);
  print('$degrees 度对应的弧度是: $radians');

  var sinOf30degrees = sin(radians);
  // sin(30°) 应该约等于 0.5
  print('sin($degrees°) = $sinOf30degrees');
  // 由于浮点数精度问题，直接比较可能失败，所以检查差的绝对值是否足够小
  assert((sinOf30degrees - 0.5).abs() < 0.01);

  // --- 最大值和最小值 ---
  print('\n--- 最大值和最小值 ---');
  int a = 1;
  int b = 1000;
  int c = -1000;

  // max(a, b) 返回 a 和 b 中较大的那个
  print('max($a, $b) = ${max(a, b)}');
  assert(max(a, b) == 1000);

  // min(a, c) 返回 a 和 c 中较小的那个
  print('min($a, $c) = ${min(a, c)}');
  assert(min(a, c) == -1000);

  // 也可以用于 double 类型
  double d1 = 3.14;
  double d2 = 2.71;
  print('max($d1, $d2) = ${max(d1, d2)}');
  assert(max(d1, d2) == 3.14);

  // --- 数学常数 ---
  print('\n--- 数学常数 ---');
  // dart:math 库预定义了一些常用的数学常数

  print('自然对数的底 e = $e'); // 约 2.71828
  print('圆周率 pi = $pi'); // 约 3.14159
  print('2的平方根 sqrt2 = $sqrt2'); // 约 1.41421
  print('1/2的平方根 sqrt1_2 = $sqrt1_2'); // 约 0.70710

  // 还有其他常数，如 ln10, ln2, log10e, log2e

  // --- 随机数 ---
  print('\n--- 随机数 ---');
  // 使用 Random 类生成随机数

  // 创建一个 Random 对象
  var random = Random(); // 使用默认种子，每次运行结果可能不同

  // 生成一个 0.0 (包含) 到 1.0 (不包含) 之间的随机双精度浮点数: [0.0, 1.0)
  double randomDouble = random.nextDouble();
  print('随机 double [0.0, 1.0): $randomDouble');

  // 生成一个 0 (包含) 到指定值 (不包含) 之间的随机整数: [0, max)
  int randomInt = random.nextInt(10); // 生成 0 到 9 之间的随机整数
  print('随机 int [0, 10): $randomInt');
  assert(randomInt >= 0 && randomInt < 10);

  // 生成一个随机布尔值 (true 或 false)
  bool randomBool = random.nextBool();
  print('随机 bool: $randomBool');

  // 你也可以提供一个种子来创建 Random 对象，这样每次运行生成的序列将是相同的
  var seededRandom = Random(12345); // 使用固定种子 12345
  print('\n使用种子 12345 的随机数序列:');
  print(' - double: ${seededRandom.nextDouble()}');
  print(' - int [0, 100): ${seededRandom.nextInt(100)}');
  print(' - bool: ${seededRandom.nextBool()}');
  // 再次创建使用相同种子的 Random 对象，会产生相同的序列
  var seededRandomAgain = Random(12345);
  assert(seededRandom.nextDouble() == seededRandomAgain.nextDouble());

  // 注意：默认的 Random 不适用于加密目的！
  // 如需加密安全的随机数，请使用 Random.secure()
  try {
    var secureRandom = Random.secure();
    print('\n生成一个加密安全的随机 int [0, 256): ${secureRandom.nextInt(256)}');
  } catch (e) {
    // Random.secure() 可能在某些环境（如浏览器编译目标）中不可用
    print('\n无法创建 Random.secure(): $e');
  }

  print('\n--- Dart Math 库示例结束 ---');
}
